from flask import g, current_app, jsonify, request
from ihome import db, constants
from ihome.api_1_0 import api
from ihome.models import User
from ihome.response_code import RET
from ihome.utils.commons import login_required
from ihome.utils.image_storage import storage


@api.route('user/auth', methods=['GET'])
@login_required
def get_auth():
    """
    获取用户实名认证信息
    :return:
    """
    user_id = g.user_id
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据查询错误")

    # 如果用户不存在
    if user is None:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户不存在")

    return jsonify(errno=RET.OK, errmsg="OK", data=user.to_dict())


@api.route('user/auth', methods=['POST'])
@login_required
def set_auth():
    """
    实名认证
    :return:
    """
    # 1.获取服务器数据并判断
    json_dict = request.get_json()
    real_name = json_dict['real_name']
    id_card = json_dict['id_card']
    if not all([real_name, id_card]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    # 2.获取当前用户的模型并更新认证信息
    user_id = g.user_id
    try:
        User.query.filter_by(id=user_id).update({'real_name':real_name, 'id_card':id_card})
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="认证信息保存失败")
    else:

        # 3.返回修改结果
        return jsonify(errno=RET.OK, errmsg="认证信息保存成功")


@api.route('/user/name', methods=["POST"])
@login_required
def set_user_name():
    """
    设置用户名
    1.获取前端提交的数据，并判断数据是否有值
    2.查询出指定user并更新 name 属性
    3.返回修改结果
    :return:
    """

    # 1.获取前端提交的数据，并判断数据是否有值
    json_dict = request.get_json()
    name = json_dict['name']
    if name is None:
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    # 2.查询出指定user并更新 name 属性
    try:
        User.query.filter_by(id=g.user_id).update({'name':name})
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="更新数据出错")
    else:

        # 3.返回修改结果
        return jsonify(errno=RET.OK, errmsg="修改成功")


@api.route('/user/avatar', methods=['POST'])
@login_required
def upload_avatar():
    """
    上传个人头像
    1.取到客户端上传的文件并判断
    2.使用七牛云上传文件
    3.更新当前用户头像地址信息
    4.返回用户头像地址
    :return:
    """
    # 1.取到客户端上传的文件并判断
    try:
        avatar_data = request.files.get("avatar").read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="传入参数有误")

    # 2.使用七牛云上传文件
    try:
        image_name = storage(avatar_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg="上传头像失败")

    # 3.更新当前用户头像地址信息
    user_id = g.user_id
    try:
        User.query.filter_by(id=user_id).update({'avatar_url': image_name})
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="图片保存失败")

    # 4.返回用户头像地址
    else:
        avatar_url = constants.QINIU_DOMIN_PREFIX + image_name
        return jsonify(errno=RET.OK, errmsg="图片上传成功", data={'avatar_url': avatar_url})


@api.route('/user', methods=["GET"])
@login_required
def get_user_profile():
    """
    获取个人信息
    :return:
    """
    # 获取当前登录用户id
    user_id = g.user_id

    # 查询当前登录用户
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据查询错误")

    # 如果用户不存在
    if user is None:
        return jsonify(errno=RET.USERERR, errmsg="用户不存在")

    return jsonify(errno=RET.OK, errmsg="OK", data=user.to_dict())
